/**
 * express中间件
 * 1. 中间件是一个函数
 * 2. 中间件函数接收三个参数: request, response, next
 *     next: 用于执行下一个中间件
 * 3. 和路由的区别: 路由是对请求的路径进行判断, 中间件是对请求的处理
 */

/**
 * 全局生效的中间件： 
 * 1.客户端发起的任何请求到服务器都会经过这个中间件
 * 2.通过 app.use() 即可定义一个全局生效的中间件
 * 
 * 多个中间件
 * 1.多个中间件之间共享同一份请求对象和响应对象。
 * 2.多个中间件之间通过 next() 方法来执行下一个中间件
 * 3.中间件的执行顺序和中间件的定义顺序一致
 * 4.可以在上游的中间件中对请求对象和响应对象进行处理，然后传递给下游的中间件
 * 
 * 多个全局中间件
 * 1.可以使用多个 app.use() 来定义多个全局中间件
 * 
 * 局部中间件
 * 1.可以使用 app.get()、app.post() 等方法来定义局部中间件
 * 
 * 中间件的五个使用注意事项
 * 1.中间件必须在路由之前定义
 * 2.客户端发送过来的请求，可以连续进入多个中间件
 * 3.执行完一个中间件，必须调用 next() 方法，将控制权交给下一个中间件，如果不调用 next() 方法，请求会被挂起
 * 4.为了防止代码逻辑混乱，建议将中间件定义在单独的文件中，调用next（）函数后不要再执行其他代码
 * 5.连续调用多个中间件时，多个中间件之间共享同一个请求对象和响应对象
*/
const express = require('express')

const app = express()

app.use((req, res, next) => {
    console.log('客户端发起的任何请求到服务器都会经过这个中间件')
    next()
})

app.use((req, res, next) => {
    console.log('第二个全局中间件')
    next()
})

app.get('/', (req, res) => {
    res.send('全局生效的中间件')
})

// 局部中间件
const mv1 = (req, res, next) => {
    console.log('局部中间件1')
    next()
}
const mv2 = (req, res, next) => {
    console.log('局部中间件2')
    next()
}
app.get('/user',[ mv1, mv2], (req, res) => {
    res.send('局部中间件')
})

app.listen(3001, () => {
    console.log('server is running at http://localhost:3001')
})